home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 576-600 / 579 / cass / cass_ntsc.p < prev    next >
Text File  |  1995-03-15  |  25KB  |  731 lines

  1. program CassetteCoverPrinter_NTSC;
  2.  
  3. { This program prints out cassette labels either as ASCII-Files or as source
  4.   for use with LaTeX.
  5.   NTSC Version 1.1
  6.   ©1991 by Jörn Clausen                                                      }
  7.  
  8.  
  9. { Get the right stuff. }
  10. uses Intuition,Graphics;
  11. from Windows uses ArpFilerequester;
  12.  
  13.  
  14. { A few useful things. }
  15. const spaces="                                ";
  16.       line="+-------------------------------------------------------------------+";
  17.       fileIDstandard="CASSDATA"
  18.  
  19.  
  20. { This one needed for all the borders. }
  21. type IntArr10=array [1..10] of integer;
  22.  
  23.  
  24. { Loads of definitions. }
  25. var MyScreen                                  : ^Screen;
  26.     MyWindow                                  : ^Window;
  27.     Msg                                       : ^IntuiMessage;
  28.     Running,success                           : boolean;
  29.     ProjMen,PrinMen                           : Menu;
  30.     Clear,Load,Save,About,Quit,ASCII,LaTeX,
  31.     ToFile,ToPrinter                          : MenuItem;
  32.     SongGad                                   : array [1..20] of Gadget;
  33.     SongTexInfo                               : array [1..20] of StringInfo;
  34.     SongTex,UndoSongTex                       : array [1..20] of String[32];
  35.     OtherSideTeX                              : array [1..2,1..20] of String[32];
  36.     TitleGad                                  : array [1..4] of Gadget;
  37.     TitleTexInfo                              : array [1..4] of StringInfo;
  38.     TitleTex,UndoTitleTex                     : array [1..4] of String[32];
  39.     NRGad,SourceGad,DateGad                   : array [1..2] of Gadget;
  40.     DateTexInfo                               : array [1..2] of StringInfo;
  41.     DateTex,UndoDateTex                       : array [1..2] of String[11];
  42.     LengthGad,PosGad,SwitchGad                : Gadget;
  43.     TextBord,NRBord,SourceBord,DateBord,
  44.     LengthBord,PosBord,SwitchBord             : Border;
  45.     TextBordXY,NRBordXY,SourceBordXY,
  46.     DateBordXY,LengthBordXY,PosBordXY,
  47.     SwitchBordXY                              : IntArr10;
  48.     NRGadText,SourceGadText,DateIText,
  49.     LengthGadText,PosGadText,SwitchGadText,
  50.     ClearIText,LoadIText,SaveIText,AboutIText,
  51.     QuitIText,ASCIIIText,LaTeXIText,
  52.     ToFileIText,ToPrinterIText                : IntuiText;
  53.     Side,Length,Pos                           : integer;
  54.     NR,Source                                 : array [1..2] of integer;
  55.     NRText                                    : array [1..5] of String[9];
  56.     LengthText                                : array [1..5] of String[4];
  57.     PosText                                   : array [1..3] of String[7];
  58.     SourceText                                : array [1..9] of String[9];
  59.     Picked,PMenu,PMenuItem,PMenuSubItem       : integer;
  60.     ClickGad                                  : ^Gadget;
  61.     Output                                    : text;
  62.  
  63.  
  64. { This looks rather ugly, but how can I convert integers to strings without
  65.   causing too much problems? }
  66. procedure PrintNumbers;
  67.   var start,i,j : integer;
  68.       NumIText  : IntuiText;
  69.       Number    : String;
  70.  begin
  71.   for j:=1 to 10 do
  72.    begin
  73.     start:=Side*10;
  74.     i:=j+start;
  75.     if i<10 then
  76.      Number:=Concat(' ',chr(i+48));
  77.     if (i>9) and (i<20) then
  78.      Number:=Concat('1',chr(i+38));
  79.     if (i>19) and (i<30) then
  80.      Number:=Concat('2',chr(i+28));
  81.     if i=30 then Number:='30';
  82.     NumIText:=IntuiText(1,0,JAM2,0,0,nil,Number,nil);
  83.     PrintIText(MyWindow^.RPort,^NumIText,310,11*j+3);
  84.    end;
  85.  end;
  86.  
  87.  
  88. procedure PrintNR(NRSide:integer);
  89.   var NRIText : IntuiText;
  90.  begin
  91.   NRIText:=IntuiText(1,0,JAM2,0,0,nil,NRText[NR[NRSide]],nil);
  92.   PrintIText(MyWindow^.RPort,^NRIText,340*(NRSide-1)+62,156);
  93.  end;
  94.  
  95.  
  96. procedure PrintSource(SourceSide:integer);
  97.   var SourceIText : IntuiText;
  98.  begin
  99.   SourceIText:=IntuiText(1,0,JAM2,0,0,nil,SourceText[Source[SourceSide]],nil);
  100.   PrintIText(MyWindow^.RPort,^SourceIText,340*(SourceSide-1)+217,156);
  101.  end;
  102.  
  103.  
  104. procedure PrintLength;
  105.   var LengthIText : IntuiText;
  106.  begin
  107.   LengthIText:=IntuiText(1,0,JAM2,0,0,nil,LengthText[Length],nil);
  108.   PrintIText(MyWindow^.RPort,^LengthIText,164,187);
  109.  end;
  110.  
  111.  
  112. procedure PrintPos;
  113.   var PosIText : IntuiText;
  114.  begin
  115.   PosIText:=IntuiText(1,0,JAM2,0,0,nil,PosText[Pos],nil);
  116.   PrintIText(MyWindow^.RPort,^PosIText,333,187);
  117.  end;
  118.  
  119.  
  120. { Define tape sorts, lengths, noise reductions etc. Adjust them according to
  121.   your special needs. }
  122. procedure DoVariables;
  123.  begin
  124.   NR[1]:=4; NR[2]:=4;
  125.   NRText[1]:='None    '; NRText[2]:='Dolby B '; NRText[3]:='Db B MPX';
  126.   NRText[4]:='Dolby C '; NRText[5]:='Db C MPX';
  127.   Source[1]:=1; Source[2]:=1;
  128.   SourceText[1]:='CD      '; SourceText[2]:='Phono   ';
  129.   SourceText[3]:='Tuner   '; SourceText[4]:='DAT     ';
  130.   SourceText[5]:='Tape    '; SourceText[6]:='Video   ';
  131.   SourceText[7]:='TV      '; SourceText[8]:='Computer';
  132.   SourceText[9]:='        ';
  133.   Length:=4;
  134.   LengthText[1]:='30 '; LengthText[2]:='45 '; LengthText[3]:='60 ';
  135.   LengthText[4]:='90 '; LengthText[5]:='120';
  136.   Pos:=2;
  137.   PosText[1]:='Normal'; PosText[2]:='Chrome'; PosText[3]:='Metal ';
  138.   Side:=0;
  139.  end;
  140.  
  141.  
  142. { Open Screen and Window. OK, OK, I know, this should be done more carefully,
  143.   but this is the way described in the handbook. I guess, that Open_Screen and
  144.   Open_Window, which are special Kick-Pascal functions, check if they return a
  145.   screen or a window. For this reason I don't check it again.}
  146. procedure DoScreen;
  147.  begin
  148.   MyScreen:=Open_Screen(0,0,640,200,2,0,1,HIRES,'Cassette Cover Printer V1.1');
  149.   MyWindow:=Open_Window(0,0,640,200,1,GADGETUP+GADGETDOWN+MENUPICK+_CLOSEWINDOW,WINDOWDEPTH+WINDOWCLOSE+ACTIVATE,'Cassette Cover Printer V1.1',MyScreen,320,640,320,640);
  150.  end;
  151.  
  152.  
  153. { Define the pull-down-menus. }
  154. procedure DoMenu;
  155.  begin
  156.   ProjMen:=Menu(^PrinMen,10,0,90,10,MENUENABLED,'Project',^Load,0,0,0,0);
  157.    Load:=MenuItem(^Save,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LoadIText,nil,'O',nil,0);
  158.    LoadIText:=IntuiText(0,1,JAM2,1,1,nil,'Open',nil);
  159.    Save:=MenuItem(^Clear,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^SaveIText,nil,'S',nil,0);
  160.    SaveIText:=IntuiText(0,1,JAM2,1,1,nil,'Save',nil);
  161.    Clear:=MenuItem(^About,0,20,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ClearIText,nil,'C',nil,0);
  162.    ClearIText:=IntuiText(0,1,JAM2,1,1,nil,'Clear',nil);
  163.    About:=MenuItem(^Quit,0,30,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^AboutIText,nil,chr(0),nil,0);
  164.    AboutIText:=IntuiText(0,1,JAM2,1,1,nil,'About',nil);
  165.    Quit:=MenuItem(nil,0,40,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^QuitIText,nil,chr(0),nil,0);
  166.    QuitIText:=IntuiText(0,1,JAM2,1,1,nil,'Quit',nil);
  167.  
  168.   PrinMen:=Menu(nil,120,0,90,10,MENUENABLED,'Print',^ASCII,0,0,0,0);
  169.    ASCII:=MenuItem(^LaTeX,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHNONE,0,^ASCIIIText,nil,chr(0),^ToPrinter,0);
  170.    ASCIIIText:=IntuiText(0,1,JAM2,1,1,nil,'ASCII',nil);
  171.     ToPrinter:=MenuItem(^ToFile,90,0,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToPrinterIText,nil,'P',nil,0);
  172.     ToPrinterIText:=IntuiText(0,1,JAM2,1,1,nil,'to Printer',nil);
  173.     ToFile:=MenuItem(nil,90,10,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToFileIText,nil,'F',nil,0);
  174.     ToFileIText:=IntuiText(0,1,JAM2,1,1,nil,'to File',nil);
  175.    LaTeX:=MenuItem(nil,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LaTeXIText,nil,'L',nil,0);
  176.    LaTeXIText:=IntuiText(0,1,JAM2,1,1,nil,'LaTeX',nil);
  177.  
  178.   SetMenuStrip(MyWindow,^ProjMen);
  179.  end;
  180.  
  181.  
  182. { And define all the gadgets. }
  183. procedure DoGadgets;
  184.   var i : integer;
  185.  begin
  186.   TextBord:=Border(0,0,1,0,JAM1,5,^TextBordXY,nil);
  187.   TextBordXY:=IntArr10(-3,-2,258,-2,258,9,-3,9,-3,-2);
  188.   for i:=1 to 10 do
  189.    begin
  190.     SongGad[i]:=Gadget(nil,22,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i],i,0);
  191.     SongTexInfo[i]:=StringInfo(^SongTex[i],^UndoSongTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
  192.     SongTex[i]:=''; UndoSongTex[i]:=''; OtherSideTex[1,i]:=''; OtherSideTex[2,i]:='';
  193.     AddGadget(MyWindow,^SongGad[i],nil);
  194.     SongGad[i+10]:=Gadget(nil,362,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i+10],i+10,0);
  195.     SongTexInfo[i+10]:=StringInfo(^SongTex[i+10],^UndoSongTex[i+10],0,32,0,0,0,0,0,0,nil,0,nil);
  196.     SongTex[i+10]:=''; UndoSongTex[i+10]:=''; OtherSideTex[1,i+10]:=''; OtherSideTeX[2,i+10]:='';
  197.     AddGadget(MyWindow,^SongGad[i+10],nil);
  198.    end;
  199.  
  200.   for i:=1 to 2 do
  201.    begin
  202.     TitleGad[i]:=Gadget(nil,22,11*i+118,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i],i+20,0);
  203.     TitleTexInfo[i]:=StringInfo(^TitleTex[i],UndoTitleTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
  204.     TitleTex[i]:=''; UndoTitleTex[i]:='';
  205.     AddGadget(MyWindow,^TitleGad[i],nil);
  206.     TitleGad[i+2]:=Gadget(nil,362,11*i+118,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i+2],i+22,0);
  207.     TitleTexInfo[i+2]:=StringInfo(^TitleTex[i+2],UndoTitleTex[i+2],0,32,0,0,0,0,0,0,nil,0,nil);
  208.     TitleTex[i+2]:=''; UndoTitleTex[i+2]:='';
  209.     AddGadget(MyWindow,^TitleGad[i+2],nil);
  210.    end;
  211.  
  212.   NRBord:=Border(0,0,1,0,JAM1,5,^NRBordXY,nil);
  213.   NRBordXY:=IntArr10(-4,-2,23,-2,23,9,-4,9,-4,-2);
  214.   NRGadText:=IntuiText(1,0,JAM1,2,0,nil,'NR',nil);
  215.   for i:=1 to 2 do
  216.    begin
  217.     NRGad[i]:=Gadget(nil,340*(i-1)+23,156,20,8,GADGHBOX,RELVERIFY,BOOLGADGET,^NRBord,nil,^NRGadText,0,nil,24+i,0);
  218.     AddGadget(MyWindow,^NRGad[i],nil);
  219.     PrintNR(i);
  220.    end;
  221.  
  222.   SourceBord:=Border(0,0,1,0,JAM1,5,^SourceBordXY,nil);
  223.   SourceBordXY:=IntArr10(-4,-2,53,-2,53,9,-4,9,-4,-2);
  224.   SourceGadText:=IntuiText(1,0,JAM1,1,0,nil,'Source',nil);
  225.   for i:=1 to 2 do
  226.    begin
  227.     SourceGad[i]:=Gadget(nil,340*(i-1)+148,156,50,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SourceBord,nil,^SourceGadText,0,nil,26+i,0);
  228.     AddGadget(MyWindow,^SourceGad[i],nil);
  229.     PrintSource(i);
  230.    end;
  231.  
  232.   DateBord:=Border(0,0,1,0,JAM1,5,^DateBordXY,nil);
  233.   DateBordXY:=IntArr10(-3,-2,90,-2,90,9,-3,9,-3,-2);
  234.   DateIText:=IntuiText(1,0,JAM1,0,0,nil,'Date',nil);
  235.   for i:=1 to 2 do
  236.    begin
  237.     DateGad[i]:=Gadget(nil,340*(i-1)+69,172,87,8,GADGHCOMP,GADGIMMEDIATE,STRGADGET,^DateBord,nil,nil,0,^DateTexInfo[i],28+i,0);
  238.     DateTexInfo[i]:=StringInfo(^DateTex[i],^UndoDateTex[i],0,11,0,0,0,0,0,0,nil,0,nil);
  239.     DateTex[i]:=''; UndoDateTex[i]:='';
  240.     AddGadget(MyWindow,^DateGad[i],nil);
  241.     PrintIText(MyWindow^.RPort,^DateIText,340*(i-1)+20,172);
  242.    end;
  243.  
  244.   LengthBord:=Border(0,0,1,0,JAM1,5,^LengthBordXY,nil);
  245.   LengthBordXY:=IntArr10(-4,-2,21,-2,21,9,-4,9,-4,-2);
  246.   LengthGadText:=IntuiText(1,0,JAM1,5,0,nil,'C',nil);
  247.   LengthGad:=Gadget(nil,128,187,18,8,GADGHBOX,RELVERIFY,BOOLGADGET,^LengthBord,nil,^LengthGadText,0,nil,31,0);
  248.   AddGadget(MyWindow,^LengthGad,nil);
  249.   PrintLength;
  250.  
  251.   PosBord:=Border(0,0,1,0,JAM1,5,^PosBordXY,nil);
  252.   PosBordXY:=IntArr10(-4,-2,70,-2,70,9,-4,9,-4,-2);
  253.   PosGadText:=IntuiText(1,0,JAM1,2,0,nil,'Position',nil);
  254.   PosGad:=Gadget(nil,247,187,67,8,GADGHBOX,RELVERIFY,BOOLGADGET,^PosBord,nil,^PosGadText,0,nil,32,0);
  255.   AddGadget(MyWindow,^PosGad,nil);
  256.   PrintPos;
  257.  
  258.   SwitchBord:=Border(0,0,1,0,JAM1,5,^SwitchBordXY,nil);
  259.   SwitchBordXY:=IntArr10(-4,-2,101,-2,101,9,-4,9,-4,-2);
  260.   SwitchGadText:=IntuiText(1,0,JAM1,1,0,nil,'Switch Sides',nil);
  261.   SwitchGad:=Gadget(nil,430,187,98,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SwitchBord,nil,^SwitchGadText,0,nil,33,0);
  262.   AddGadget(MyWindow,^SwitchGad,nil);
  263.  
  264.   PrintNumbers;
  265.   RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  266.  end;
  267.  
  268.  
  269. { Switch to next noise redurction, source, etc. }
  270. procedure NextNR(NRSide:integer);
  271.  begin
  272.   if NR[NRSide]=5 then
  273.    NR[NRSide]:=1
  274.   else
  275.    NR[NRSide]:=Succ(NR[NRSide]);
  276.   PrintNR(NRSide);
  277.  end;
  278.  
  279.  
  280. procedure NextSource(SourceSide:integer);
  281.  begin
  282.   if Source[SourceSide]=9 then
  283.    Source[SourceSide]:=1
  284.   else
  285.    Source[SourceSide]:=Succ(Source[SourceSide]);
  286.   PrintSource(SourceSide);
  287.  end;
  288.  
  289.  
  290. procedure NextLength;
  291.  begin
  292.   if Length=5 then
  293.    Length:=1
  294.   else
  295.    Length:=Succ(Length);
  296.   PrintLength;
  297.  end;
  298.  
  299.  
  300. procedure NextPos;
  301.  begin
  302.   if Pos=3 then
  303.    Pos:=1
  304.   else
  305.    Pos:=Succ(Pos);
  306.   PrintPos;
  307.  end;
  308.  
  309.  
  310. procedure SwitchSides;
  311.   var i     : integer;
  312.       dummy : String[32];
  313.  begin
  314.   for i:=1 to 20 do
  315.    case Side of
  316.     0,2 : begin
  317.            dummy:=SongTex[i];
  318.            SongTex[i]:=OtherSideTex[1,i];
  319.            OtherSideTex[1,i]:=dummy;
  320.           end;
  321.       1 : begin
  322.            dummy:=SongTex[i];
  323.            SongTex[i]:=OtherSideTex[2,i];
  324.            OtherSideTex[2,i]:=dummy;
  325.           end;
  326.    end;
  327.   if Side=2 then
  328.    for i:=1 to 20 do
  329.     begin
  330.      dummy:=OtherSideTex[1,i];
  331.      OtherSideTex[1,i]:=OtherSideTex[2,i];
  332.      OtherSideTex[2,i]:=dummy;
  333.     end;
  334.   RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  335.   if Side=2 then
  336.    Side:=0
  337.   else
  338.    Side:=Side+1;
  339.   PrintNumbers;
  340.  end;
  341.  
  342.  
  343. { Load data-file. }
  344. procedure LoadData;
  345.   var i,j                         : integer;
  346.       filename,fileID             : string;
  347.       BodyIText,PosIText,NegIText : IntuiText;
  348.       loadfile,answer             : boolean;
  349.  begin
  350.   loadfile:=false;
  351.   while not loadfile do
  352.    begin
  353.     filename:=FileReq(MyWindow,'Load Data');
  354.     if filename='' then exit;
  355.     Reset(Output,filename);
  356.     readln(Output,fileID);
  357.     if fileID=fileIDstandard then loadfile:=true else
  358.      begin
  359.       BodyIText:=IntuiText(0,1,JAM2,30,5,nil,'This is no Data-File',nil);
  360.       PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Retry',nil);
  361.       NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Cancel',nil);
  362.       answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,250,60);
  363.       if answer=false then exit;
  364.      end;
  365.    end;
  366.    if Side=1 then SwitchSides;
  367.    if Side=2 then SwitchSides;
  368.    for i:=1 to 4 do
  369.     readln(Output,TitleTex[i]);
  370.    for i:=1 to 10 do
  371.     readln(Output,SongTex[i]);
  372.    for j:=1 to 2 do
  373.     for i:=1 to 10 do
  374.      readln(Output,OtherSideTex[j,i]);
  375.    for i:=11 to 20 do
  376.     readln(Output,SongTex[i]);
  377.    for j:=1 to 2 do
  378.     for i:=11 to 20 do
  379.      readln(Output,OtherSideTex[j,i]);
  380.    for i:=1 to 2 do
  381.     begin
  382.      readln(Output,NR[i]);
  383.      readln(Output,Source[i]);
  384.      readln(Output,DateTex[i]);
  385.     end;
  386.    readln(Output,Length);
  387.    readln(Output,Pos);
  388.    Close(Output);
  389.    RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  390.    for i:=1 to 2 do
  391.     begin
  392.      PrintNR(i);
  393.      PrintSource(i);
  394.     end;
  395.    PrintLength;
  396.    PrintPos;
  397.   end;
  398.  
  399.  
  400. { Save data-file. }
  401. procedure SaveData;
  402.   var i,j      : integer;
  403.       filename : string;
  404.  begin
  405.   filename:=FileReq(MyWindow,'Save Data');
  406.   if filename<>'' then
  407.    begin
  408.     if Side=1 then SwitchSides;
  409.     if Side=2 then SwitchSides;
  410.     Rewrite(Output,filename);
  411.     writeln(Output,fileIDstandard);
  412.     for i:=1 to 4 do
  413.      writeln(Output,TitleTex[i]);
  414.     for i:=1 to 10 do
  415.      writeln(Output,SongTex[i]);
  416.     for j:=1 to 2 do
  417.      for i:=1 to 10 do
  418.       writeln(Output,OtherSideTex[j,i]);
  419.     for i:=11 to 20 do
  420.      writeln(Output,SongTex[i]);
  421.     for j:=1 to 2 do
  422.      for i:=11 to 20 do
  423.       writeln(Output,OtherSideTex[j,i]);
  424.     for i:=1 to 2 do
  425.      begin
  426.       writeln(Output,NR[i]);
  427.       writeln(Output,Source[i]);
  428.       writeln(Output,DateTex[i]);
  429.      end;
  430.     writeln(Output,Length);
  431.     writeln(Output,Pos);
  432.     Close(Output);
  433.     DisplayBeep(MyScreen);
  434.    end;
  435.  end;
  436.  
  437.  
  438. { Erase present contents of the gadgest. }
  439. procedure ClearData;
  440.   var i                           : integer;
  441.       BodyIText,PosIText,NegIText : IntuiText;
  442.       answer                      : boolean;
  443.  begin
  444.   BodyIText:=IntuiText(0,1,JAM2,7,5,nil,'Data will be lost! Continue?',nil);
  445.   PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  446.   NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  447.   answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  448.   if answer=false then exit;
  449.   for i:=1 to 20 do
  450.    begin
  451.     SongTex[i]:=''; UndoSongTex[i]:='';
  452.     OtherSideTex[1,i]:=''; OtherSideTex[2,i]:='';
  453.    end;
  454.   for i:=1 to 4 do
  455.    begin
  456.     TitleTex[i]:=''; UndoTitleTex[i]:='';
  457.    end;
  458.   DateTex[1]:=''; UndoDateTex[1]:='';
  459.   DateTex[2]:=''; UndoDateTex[2]:='';
  460.   DoVariables;
  461.   RefreshGList(MyWindow^.FirstGadget,MyWindow,nil,-1);
  462.   PrintNumbers;
  463.   PrintNR(1); PrintNR(2);
  464.   PrintSource(1); PrintSource(2);
  465.   PrintLength;
  466.   PrintPos;
  467.  end;
  468.  
  469.  
  470. { Output line to whatever will receive it, either PRT: or a file. }
  471. procedure PrintLine(TexA,TexB:String;Middle:Char);
  472.   var PTexA,PTexB : string;
  473.  begin
  474.   PTexA:=TexA+Copy(spaces,1,31-StrLen(TexA));
  475.   PTexB:=TexB+Copy(spaces,1,31-StrLen(TexB));
  476.   writeln(Output,"| "+PTexA+" "+Middle+" "+PTexB+" |");
  477.  end;
  478.  
  479.  
  480. { Print the cover made out of ASCII-character. }
  481. procedure OutputCover(filename:string);
  482.   var i          : integer;
  483.       Middle     : char;
  484.       pron,proff : string;
  485.       ExtPrint   : boolean;
  486.  begin
  487.   pron:=chr(27)+"[4w"+chr(27)+"[2"+chr(34)+"z"+chr(27)+"(B";
  488.   proff:=chr(27)+"[0w"+chr(27)+"[1"+chr(34)+"z";
  489.   if Side=1 then SwitchSides;
  490.   if Side=2 then SwitchSides;
  491.   ExtPrint:=false;
  492.   for i:=6 to 10 do
  493.    if (OtherSideTex[1,i]<>'') or (OtherSideTex[1,i+10]<>'') then ExtPrint:=true;
  494.   for i:=1 to 20 do
  495.    if OtherSideTex[2,i]<>'' then ExtPrint:=true;
  496.   ReWrite(Output,filename);
  497.   write(Output,pron);
  498.   writeln(Output,line);
  499.   if ExtPrint then
  500.    begin
  501.     for i:=6 to 10 do
  502.      PrintLine(OtherSideTex[1,i],OtherSideTex[1,i+10],"|");
  503.     for i:=1 to 10 do
  504.      PrintLine(OtherSideTex[2,i],OtherSideTex[2,i+10],"|");
  505.     writeln(Output,line);
  506.    end;
  507.   Middle:="|"
  508.   for i:=1 to 10 do
  509.    PrintLine(SongTex[i],SongTex[i+10],Middle);
  510.   for i:=1 to 5
  511.    begin
  512.     if ExtPrint and (i=5) then Middle:="V";
  513.     PrintLine(OtherSideTex[1,i],OtherSideTex[1,i+10],Middle);
  514.    end;
  515.   writeln(Output,line);
  516.   PrintLine(TitleTex[1],TitleTex[2]," ");
  517.   PrintLine(TitleTex[3],TitleTex[4]," ");
  518.   writeln(Output,line);
  519.   PrintLine("NR: "+NRText[NR[1]]+"   Source: "+SourceText[Source[1]],"NR: "+NRText[NR[2]]+"   Source: "+SourceText[Source[2]],"|");
  520.   PrintLine("Date: "+DateTex[1],"Date: "+DateTex[2],"|");
  521.   writeln(Output,"|"+Copy(spaces,1,15)+"C"+LengthText[Length]+Copy(spaces,1,24)+"Position: "+PosText[Pos]+Copy(spaces,1,8)+"|");
  522.   writeln(Output,line);
  523.   writeln(Output,proff);
  524.   Close(Output);
  525.   DisplayBeep(MyScreen);
  526.  end;
  527.  
  528.  
  529. { Send cover to printer. }
  530. procedure PrintCover;
  531.  begin
  532.   OutputCover('prt:');
  533.  end;
  534.  
  535.  
  536. { Send cover to file. }
  537. procedure SaveCover;
  538.   var filename:string;
  539.  begin
  540.   filename:=FileReq(MyWindow,'Save Cover');
  541.   if filename<>'' then OutputCover(filename);
  542.  end;
  543.  
  544.  
  545. { Produce LaTeX-file. }
  546. procedure SaveLaTeX;
  547.   var i        : integer;
  548.       filename : string;
  549.       ExtPrint : boolean;
  550.  begin
  551.   filename:=FileReq(MyWindow,'Save LaTeX Source File');
  552.   if filename<>'' then
  553.    begin
  554.     ExtPrint:=false;
  555.     if Side=1 then SwitchSides;
  556.     if Side=2 then SwitchSides;
  557.     for i:=6 to 10 do
  558.      if (OtherSideTex[1,i]<>'') or (OtherSideTex[1,i+10]<>'') then ExtPrint:=true;
  559.     for i:=1 to 20 do
  560.      if OtherSideTex[2,i]<>'' then ExtPrint:=true;
  561.     Rewrite(Output,filename);
  562.     writeln(Output,'\documentstyle{article}');
  563.     writeln(Output,'\begin{document}');
  564.     writeln(Output,'\pagestyle{empty}');
  565.     writeln(Output,'\unitlength1mm');
  566.     writeln(Output);
  567.     if ExtPrint then
  568.      begin
  569.       writeln(Output,'\begin{picture}(102,161)(0,0)');
  570.       writeln(Output,' \put(0,0){\framebox(102,161){}}');
  571.       writeln(Output,' \put(51,29){\line(0,1){132}}');
  572.       writeln(Output,' \put(0,95){\line(1,0){102}}');
  573.      end
  574.     else
  575.      begin
  576.       writeln(Output,'\begin{picture}(102,95)(0,0)');
  577.       writeln(Output,' \put(0,0){\framebox(102,95){}}');
  578.       writeln(Output,' \put(51,29){\line(0,1){66}}');
  579.      end;
  580.     writeln(Output,' \put(0,16){\framebox(102,13){}}');
  581.     writeln(Output,' \put(0,6){\line(1,0){102}}');
  582.     writeln(Output,' \put(51,6){\line(0,1){10}}');
  583.     writeln(Output);
  584.     writeln(Output,' \put(0,1){\makebox(51,5){C'+LengthText[Length]+'}}');
  585.     writeln(Output,' \put(51,1){\makebox(51,5){Position: '+PosText[Pos]+'}}');
  586.     writeln(Output,' \put(1,6){\makebox(24,5)[l]{Date: '+DateTex[1]+'}}');
  587.     writeln(Output,' \put(52,6){\makebox(24,5)[l]{Date: '+DateTex[2]+'}}');
  588.     writeln(Output,' \put(1,11){\makebox(21,5)[l]{NR: '+NRText[NR[1]]+'}}');
  589.     writeln(Output,' \put(52,11){\makebox(21,5)[l]{NR: '+NRText[NR[2]]+'}}');
  590.     writeln(Output,' \put(26,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[1]]+'}}');
  591.     writeln(Output,' \put(77,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[2]]+'}}');
  592.     writeln(Output);
  593.     writeln(Output,' \put(1,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[1]+'}}');
  594.     writeln(Output,' \put(52,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[2]+'}}');
  595.     writeln(Output,' \put(1,17){\makebox(49,5.5)[l]{\large '+TitleTex[3]+'}}');
  596.     writeln(Output,' \put(52,17){\makebox(49,5.5)[l]{\large '+TitleTex[4]+'}}');
  597.     writeln(Output);
  598.     if ExtPrint then
  599.      begin
  600.       for i:=6 to 10 do
  601.        writeln(Output,' \put(1,',182.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[1,i]+'}}');
  602.       for i:=1 to 10 do
  603.        writeln(Output,' \put(1,',138.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[2,i]+'}}');
  604.       writeln(Output);
  605.       for i:=6 to 10 do
  606.        writeln(Output,' \put(52,',182.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[1,i+10]+'}}');
  607.       for i:=1 to 10 do
  608.        writeln(Output,' \put(52,',138.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[2,i+10]+'}}');
  609.       writeln(Output);
  610.      end;
  611.     for i:=1 to 10 do
  612.      writeln(Output,' \put(1,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i]+'}}');
  613.     for i:=1 to 5 do
  614.      writeln(Output,' \put(1,',50.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[1,i]+'}}');
  615.     writeln(Output);
  616.     for i:=1 to 10 do
  617.      writeln(Output,' \put(52,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i+10]+'}}');
  618.     for i:=1 to 5 do
  619.      writeln(Output,' \put(52,',50.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[1,i+10]+'}}');
  620.     writeln(Output);
  621.     writeln(Output,'\end{picture}');
  622.     writeln(Output);
  623.     writeln(Output,'\end{document}');
  624.     Close(Output);
  625.     DisplayBeep(MyScreen);
  626.    end;
  627.  end;
  628.  
  629.  
  630. { Ahem, well, in case anybody is interested... }
  631. procedure Copyright;
  632.   var CopyWindow:^Window;
  633.       CopyMsg:^IntuiMessage;
  634.       line1,line2,line3:IntuiText;
  635.  begin
  636.   CopyWindow:=Open_Window(150,48,340,120,1,MOUSEBUTTONS,ACTIVATE,nil,MyScreen,300,160,300,160);
  637.   line1:=IntuiText(1,0,JAM2,0,0,nil,'Cassette Cover Printer V1.1',^line2);
  638.   line2:=IntuiText(1,0,JAM2,24,28,nil,'©1991 by Jörn Clausen',^line3);
  639.   line3:=IntuiText(1,0,JAM2,44,56,nil,'This is Freeware',nil);
  640.   PrintIText(CopyWindow^.RPort,^line1,62,28);
  641.   while CopyMsg^.Class<>MOUSEBUTTONS do
  642.    begin
  643.     CopyMsg:=Wait_Port(CopyWindow^.UserPort);
  644.     CopyMsg:=Get_Msg(CopyWindow^.UserPort);
  645.    end;
  646.   Close_Window(CopyWindow);
  647.  end;
  648.  
  649.  
  650. { Hope you have enjoyed the program. }
  651. procedure QuitProg;
  652.   var BodyIText,PosIText,NegIText : IntuiText;
  653.       answer                      : boolean;
  654.  begin
  655.   BodyIText:=IntuiText(0,1,JAM2,72,5,nil,'Really Quit?',nil);
  656.   PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  657.   NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  658.   answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  659.   if answer=true then running:=false;
  660.  end;
  661.  
  662.  
  663. { And clean up the mess (although Kick-Pascal promisses to do all this on its
  664.   own, I prefer to close the things I used on my own). }
  665. procedure CloseAll;
  666.   var dummy : ptr;
  667.  begin
  668.   dummy:=RemoveGList(MyWindow,MyWindow^.FirstGadget,-1);
  669.   ClearMenuStrip(MyWindow);
  670.   Close_Window(MyWindow);
  671.   Close_Screen(MyScreen);
  672.  end;
  673.  
  674.  
  675. { Finally made it to the main loop? Keep on reading. }
  676. begin
  677.  DoVariables;
  678.  DoScreen;
  679.  DoMenu;
  680.  DoGadgets;
  681.  running:=true;
  682.  while running=true do
  683.   begin
  684.    Msg:=Wait_Port(MyWindow^.UserPort);
  685.    Msg:=Get_Msg(MyWindow^.UserPort);
  686.    case Msg^.Class of
  687.     _CLOSEWINDOW : QuitProg;
  688.     GADGETUP     : begin
  689.                     ClickGad:=Msg^.IAddress;
  690.                     case ClickGad^.GadgetID of
  691.                      1..9,11..19 : success:=ActivateGadget(^SongGad[ClickGad^.GadgetID+1],MyWindow,nil);
  692.                            21,23 : success:=ActivateGadget(^TitleGad[ClickGad^.GadgetID-19],MyWindow,nil);
  693.                               25 : NextNR(1);
  694.                               26 : NextNR(2);
  695.                               27 : NextSource(1);
  696.                               28 : NextSource(2);
  697.                               31 : NextLength;
  698.                               32 : NextPos;
  699.                               33 : SwitchSides;
  700.                      OTHERWISE;
  701.                     end;
  702.                    end;
  703.     MENUPICK     : begin
  704.                     Picked:=Msg^.Code;
  705.                     PMenu:=Picked and $1f;
  706.                     PMenuItem:=(Picked and $7e0) div 32;
  707.                     PMenuSubItem:=(Picked and $f800) div 2048;
  708.                     case PMenu of
  709.                      0 : case PMenuItem of
  710.                           0 : LoadData;
  711.                           1 : SaveData;
  712.                           2 : ClearData;
  713.                           3 : Copyright;
  714.                           4 : QuitProg;
  715.                          end;
  716.                      1 : case PMenuItem of
  717.                           0 : If PMenuSubItem=0 then
  718.                                PrintCover
  719.                               else
  720.                                SaveCover;
  721.                           1 : SaveLaTeX;
  722.                          end;
  723.                      OTHERWISE;
  724.                     end;
  725.                    end;
  726.     OTHERWISE;
  727.    end;
  728.   end;
  729.  CloseAll;
  730. end.
  731.